GtkIconTheme: Stop using the all_icons hash table
authorMatthias Clasen <mclasen@redhat.com>
Fri, 20 Jun 2014 01:37:01 +0000 (21:37 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 20 Jun 2014 05:17:45 +0000 (01:17 -0400)
This hash table was used in gtk_icon_theme_has_icon; we can
implement that function just as well without it and save some
memory.

gtk/gtkicontheme.c

index b42bf83f909915134c9e9f31f230a79d0c7c71db..8bdda09ac89c9be34f70bf8ec45bcb590dcea312 100644 (file)
@@ -334,6 +334,8 @@ static GtkIconInfo *theme_lookup_icon         (IconTheme        *theme,
 static void         theme_list_icons          (IconTheme        *theme,
                                                GHashTable       *icons,
                                                GQuark            context);
+static gboolean     theme_has_icon            (IconTheme        *theme,
+                                               const gchar      *icon_name);
 static void         theme_list_contexts       (IconTheme        *theme,
                                                GHashTable       *contexts);
 static void         theme_subdir_load         (GtkIconTheme     *icon_theme,
@@ -2326,9 +2328,11 @@ gtk_icon_theme_has_icon (GtkIconTheme *icon_theme,
         return TRUE;
     }
 
-  if (g_hash_table_lookup_extended (priv->all_icons,
-                                    icon_name, NULL, NULL))
-    return TRUE;
+  for (l = priv->themes; l; l = l->next)
+    {
+      if (theme_has_icon (l->data, icon_name))
+        return TRUE;
+    }
 
   if (icon_theme_builtin_icons &&
       g_hash_table_lookup_extended (icon_theme_builtin_icons,
@@ -2990,6 +2994,31 @@ theme_list_icons (IconTheme  *theme,
     }
 }
 
+static gboolean
+theme_has_icon (IconTheme   *theme,
+                const gchar *icon_name)
+{
+  GList *l;
+
+  for (l = theme->dirs; l; l = l->next)
+    {
+      IconThemeDir *dir = l->data;
+
+      if (dir->cache)
+        {
+          if (_gtk_icon_cache_has_icon (dir->cache, icon_name))
+            return TRUE;
+        }
+      else
+        {
+          if (g_hash_table_lookup (dir->icons, icon_name) != NULL)
+            return TRUE;
+        }
+    }
+
+  return FALSE;
+}
+
 static void
 theme_list_contexts (IconTheme  *theme, 
                      GHashTable *contexts)